import java.io.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 86185
 * Date: 2023-06-18
 * Time: 11:16
 */

/**
 * 因为涉及到六资源的关闭, 所以出现异常的话,需要使用try-catch-finally的方式处理异常
 * 对于输入流来将, 要求File类的对象对应的物理磁盘上的文件必须存在, 否则,汇报FileNotFoundException
 * 对于输出流来讲, File类的对象对应的物理磁盘上的文件可以不存在
 *  >如果不存在,则输出的过程中,会自动创建此文件,病机那个数据写入到此文件中
 *  >如果存在,使用FileWriter(File file)或FileWriter(File file, false) 输出数据的过程中,会新建同名的文件对现有的文件进行覆盖
 *           FileWriter(File file, true) 会在现有文件的末尾追加写入内容
 */
public class FileReaderWriterTest {
    /**
     * 复制一份hello.txt文件,命名为hello_copy.txt
     * @param args
     */
    public static void main(String[] args) throws IOException {
        //1. 创建File类的对象
        FileReader fileReader = null;

        FileWriter fileWriter = null;
        try {
            File file = new File("hello.txt");
            File dest = new File("hello_copy.txt");
            //2. 创建输入流输出流
            fileReader = new FileReader(file);
            fileWriter = new FileWriter(dest);
            //3. 数据的读入和写出
            char[] buff = new char[5];
            int len;
            while ((len = fileReader.read(buff)) != -1) {
                fileWriter.write(buff, 0, len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 关闭流资源
            assert fileReader != null;
            fileReader.close();
            assert fileWriter != null;
            fileWriter.close();

        }

    }
    /**
     * 将内存中的数据写入具体文件中
     * @param args
     */
    public static void main4(String[] args){
        FileWriter fileWriter = null;
        //1. 创建File对象,
        try {

            File file = new File("info.txt");//文件可以不存在
            //文件覆盖
//            fileWriter = new FileWriter(file);
//            fileWriter = new FileWriter(file, false);//不追加,和上面表达的意思一样,
            //在现有的文件基础上,追加内容
            fileWriter = new FileWriter(file, true);//追加,
            fileWriter.write("I LOVE U \n");
            fileWriter.write("U LOVE HIM \n");
            System.out.println("succeed");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(fileWriter != null) {
                    fileWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 对于main2的优化,减小与磁盘的交互
     * @param args
     */
    public static void main3(String[] args) {
        FileReader fileReader = null;
        try {
            File file = new File("D:\\IO\\io1\\abc.txt");
            fileReader = new FileReader(file);
            int data;
            char[] cbuffer = new char[5];
            int len;
            while ((len = fileReader.read(cbuffer)) !=  -1) {
                for (int i = 0; i < len; i++) {
                    System.out.print(cbuffer[i]);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 流资源的关闭
            try {
                if(fileReader != null) {
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    public static void main2(String[] args){
        FileReader fileReader = null;
        try {
            File file = new File("D:\\IO\\io1\\abc.txt");
            fileReader = new FileReader(file);
            int data;
            while ((data = fileReader.read()) != -1) {
                System.out.print((char) data);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 流资源的关闭
            try {
                if(fileReader != null) {
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    //读取文件中的内容显示在控制台上
    public static void main1(String[] args) throws IOException {
        //1. 创建一个File类对象
        File file = new File("D:\\IO\\io1\\abc.txt");
        //2. 创建输入形的字符流, 用于读取数据
        FileReader fileReader = new FileReader(file);
        //3. 读取数据,显示在控制台上
//        int c = fileReader.read();
//        while (c != -1) {
//            System.out.print((char)c);
//            c = fileReader.read();
//        }
        int data;
        while ((data = fileReader.read()) != -1) {
            System.out.print((char) data);
        }
        //4. 流资源的关闭
        fileReader.close();
    }
}
